Author:Hongyu Xiao
Graduate Student
University of Illinois at Urbana–Champaign
August, 2020
请联系我!
邮箱是:hongyu.xiao@hotmail.com
标题开头为: PEK_Summer_Question
例如 PEK_Summer_Question anaconda无法下载
Shell 是命令操作系统执行操作的程序。 可以在计算机的控制台中输入命令,然后直接运行命令,也可以使用脚本运行批量命令。 PowerShell 和 Bash 等 Shell 为系统管理员提供了对其所负责的计算机进行优化控制所需的功能和精度。
Bash 此名称是 Bourne Again Shell 的缩写。Bash 成功的一个原因是其简易性。 与 Linux 的其他 shell 类似,Bash 也基于 Unix 设计理念。 正如 Peter Salus 在其著作“A Quarter Century of Unix”中总结的那样,Unix 中体现的三个“重要思想”是:
程序可以执行一项操作,并且可以完成得很好。 程序可以协同工作。 程序可以使用文本流作为通用接口。
最后一部分是了解 Bash 工作方式的关键。 在 Unix 和 Linux 中,所有内容都是文件
来源:https://docs.microsoft.com/en-us/learn/modules/bash-introduction
此处的目录操作是指在命令行界面(CLI)进入或者切换不同的目录的操作。
主要涉及的命令(command)有三个
ls 显示当前工作目录下内容
pwd 显示当前工作目录地址
cd 切换到其他目录
%%bash
#ls ##显示当前目录下文件及文件夹
ls
ls
是常用命令之一,配合通配符,管道和重定向是我们在服务器内常用命令之一
下面给出一些例子
%%bash
echo "********************"
ls -al ##当前目录下,显示全部文件及权限
echo "*******************"
ls *Tutorial* -sh ##当前目录下,显示文件名含有Tutorial的文件,并显示其大小
echo "*******************"
ls [S,P,K,U]* ##当前目录下,显示文件名以S或者P或者K或者U开头的文件
echo "*******************"
ls ?hell_Tutorial.ipynb ##当前目录下,显示文件名为第一个字母未知,但是以hell_Tutorial.ipynb的文件
在Shell下的大多数命令都配置了帮助文档,有两种方式可以进行查看
当然,你也可以上网进行搜索查看,网上有很多的的优质资源。
以下为两种方法作为例子进行帮助文档的查看,这个基本适用于任何Shell命令
%%bash
man ls
%%bash
ls --help
%%bash
pwd ##显示当前所在的工作目录的位置
在Linux环境下,我们查看的地址分为绝对地址和相对地址
绝对地址
文件或者程序所在的绝对路径,称为绝对地址。其主要的好处是绝对地址可以精确地定位文件或者目录,坏处是对于某些储存位置比较深的路径,绝对地址会比较长,使用起来会带来不便。
相对地址
文件或者程序所在的相对路径,成为相对地址,其相对的是 当前工作目录。 相对地址可以大幅度的降低地址长度,便于使用,但是缺陷在于由于其相对于当前工作目录,如果写入shell程序中,有时就会造成目录定位的混乱。
下面我们来举个例子:
%%bash
pwd #当前工作目录
这个叫做当前工作目录。
目前的显示方式是以绝对地址的形式现实的。
对于相对地址,主要有两个经常使用的命令:
.
代表的是当前工作目录
..
代表的是当前工作目录的上一级
%%bash
cd .
echo 'I am the current working directory :'
pwd
echo '*********************************************************'
cd ..
echo 'I am the parent directory of the working directory:'
pwd
echo '*********************************************************'
find . -name Intro.ipynb
ls ./Seismology_Tutorials/Intro.ipynb -l
此处的find . -name Intro.ipynb
结果就是按照相对地址进行显示的。
如果我们想要查看Intro.ipynb的详细信息
我们可以直接 ls ./Seismology_Tutorials/Intro.ipynb
%%bash
echo "I am current working directory :"
pwd #显示当前工作目录
echo '********************************'
cd .. #切换到当前工作目录的上级目录,使用相对地址
echo "Now I am at :"
pwd #显示当前工作目录
echo '********************************'
cd /mnt/c/Users #切换到特定目录,使用绝对地址
echo "Now I am at :"
pwd #显示当前工作目录
echo '********************************'
在Linux中,每次我们使用.
或者..
在路径的时候,请注意这都是相对于当前的工作路径而言的。
而如果我们是使用绝对的路径,我们则不需要担心这个问题.
但是如你所见,如果我们的路径名称非常长的时候,输入就变成了一件麻烦事,而且可能会带来意想不到的后果。
一般而言,我们使用时还是以方便为主,大多使用相对地址,少数情况下使用绝对地址。
此处的文件操作是指在命令行界面(CLI)进行文件或者文件夹的创建,复制,修改,删除命令。
主要涉及的命令(command)有四个
mkdir 创建文件夹
cp 复制文件/文件夹
mv 移动文件/文件夹
rm 删除文件/文件夹
%%bash
mkdir Shell_Practice #创建一个名为Shell_Practice的文件夹
ls */ -d #显示在当前目录下所有的文件夹
cp
对文件或者文件夹进行复制,操作对象可以是本地文件/文件夹,也可以是特定地址的文件/文件夹。
在运行程序的过程中,我们经常面对的情况是,我们需要对脚本中的某一个或者某几个的参数进行修改,
但是我们并不确定修改后的参数能否让程序运行,所以我们又不想破坏源文件,这时候我们有以下几个选择:
Git
对脚本进行版本控制cp
对原脚本进行拷贝以备份,让后修改源文件。这三种方式都可以完成调试任务,由此可见,cp
命令是我们非常常用的命令之一。
%%bash
ls #查看当前目录下文件
echo '********************************'
cp Shell_Practice_Sample Shell_Practice/Shell_Practice_Sample_Backup
#复制Shell_Practice_Sample,重新命名为Shell_Practice_Sample_Backup
ls Shell_Practice
echo '********************************'
在上面的例子里 第一个Shell_Practice_Sample就在操作的当前录下,所以我只需要输入文件名即可
而且我们的新文件被放入了Shell_Practice文件夹中,事实上,你可以从任何地址复制任何文件到另外任何一个地址中。
除此之外, cp
命令还有个常用的功能是重命名功能。
在linux下,我们有多种重新命名文件的方式。下面以cp
命令来进行重命名。
主要步骤是
复制原文件到原地址,讲其命名为新的文件名
删除原文件
%%bash
cd Shell_Practice
cp Shell_Practice_Sample_Backup Shell_Practice_Sample_NewName
rm Shell_Practice_Sample_Backup -rf
ls
%%bash
mkdir To_Be_Moved_Folder #创建一个文件夹叫做To_Be_Moved_Folder
mv To_Be_Moved_Folder Shell_Practice #将To_Be_Moved_Folder文件夹移动到Shell_Practice内
ls Shell_Practice -d #列出在Shell_Practice目录下所有的文件夹
除此之外,我们同样可以使用mv
进行重命名。
%%bash
cd Shell_Practice #切换到Shell_Practice目录下
ls */ -d #显示当前目录下的文件夹
echo '********************************' #
mv To_Be_Moved_Folder New_Named_Folder #将To_Be_Moved_Folder重命名为New_Named_Folder
ls */ -d #显示当前目录下的文件夹
echo '********************************'
%%bash
cp Shell_Practice_Sample Shell_Practice_Sample_RM
ls Shell_Practice_Sample*
echo '********************************'
rm Shell_Practice_Sample_RM
ls Shell_Practice_Sample*
此处的文件操作是指在命令行界面(CLI)进行简单的为文本行显示操作。
主要涉及的命令(command)有三个
cat 显示文本文件内容
tail 从文本末尾开始,显示文本内容
head 从文本开头开始,显示文本内容
%%bash
cat Shell_Practice_Sample #打印Shell_Practice_Sample文件
平时的cat
命令的使用是方便我们查看部分的文本文档。
因为cat
命令相当于逐行打印文本内容,不涉及使用vim
等软件的打开操作,不占用系统资源,而这个系统资源有时候是在服务器上操作必须要考虑的问题。
tail
命令是指从本文文件的末尾开始打印文本内容
对于我们而言,常用的方式是打印特定的倒数行。
例如:
%%bash
tail -n3 Shell_Practice_Sample #打印Shell_Practice_Sample的倒数三行
echo
echo '********************************'
tail -c10 Shell_Practice_Sample #打印Shell_Practice_Sample的倒数的10个字符
tail
命令是指从本文文件的开头开始打印文本内容
对于我们而言,常用的方式是打印特定的开始行内容。
例如:
%%bash
head -n3 Shell_Practice_Sample #打印Shell_Practice_Sample的开头三行
echo '********************************'
head -c10 Shell_Practice_Sample #打印Shell_Practice_Sample的开头的10个字符
cat
head
tail
命令和其他命令的组合¶对于cat/head/tail命令,我们常用的方式是利用pipeline (后面会提到) 和 其他的 命令进行结合,以便于进行快速的查找,定位等等
举个例子:
%%bash
ps -aux | sort -nk 2 | head -n 3 # 查看此时服务上所有的进程,并且按照PID排列, 显示最小的2个PID进程
echo '********************************'
ps -aux | grep 'hongyu' | sort -nk 3 | head -n 3 # 查看所有hongyu名下的进程,并且按照CPU的占用进行排序,显示前三个
echo '********************************'
ls *.ipynb -s | sort -k 1 | tail -n 1 # 查看当前目录下全部的ipynb文件,按照其大小排序,显示最后(最大)的文件
echo '********************************'
ls *.ipynb -t | sort | tail -n 1 # 查看当前目录下全部的ipynb文件,按照其时间顺序排序,显示最新的文件
此处的文件操作是指在命令行界面(CLI)常用的一些其他操作。
主要涉及的命令(command)有三个
clear 清除屏幕显示
tar 对文件或者文件夹进行压缩和解压缩
history 显示在shell中输入的命令历史
%%bash
ps -aux
%%bash
ps -aux | clear
以上为示意,具体的应用场景是在服务器端的时候,我们经过一些命令的查询和读取我们已经得到了相关的信息,这时候我们需要用clear
命令来进行整个terminal页面的清空处理,以便于我们进行下一步的操作。
我们的程序包中生成的文件往往都是许多文件在一起的,在进行传输的时候会带来各种的不便
打包和解压缩也是比较日常的操作之一
tar
命令就是我们用来打包和解压的命令
-zcvf 选项代表创建压缩文件
-zxvf 选项代表解压文件
%%bash
tar -zcvf Shell_Practice_Sample.tar Shell_Practice_Sample
#创建一个Shell_Practice_Sample.tar的压缩文件,将Shell_Practice_Sample压缩进去
mkdir Another_Location
cd Another_Location
#创建一个新的文件夹Another_Location,并切换工作目录到这个文件夹
tar -zxvf ../Shell_Practice_Sample.tar
#将Shell_Practice_Sample.tar 文件夹解压出来
我们创建了 一个压缩文件 Shell_Practice_Sample.tar 和 一个文件夹 Another_Location , 并且我们将压缩文件解压到了新建的文件夹内。
%%bash
ls
echo '********************************'
ls Another_Location
"|" 管道命令,将管道前的命令的输出作为管道后命令的输入,可以在一行命令中多次使用。
">" 重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为覆盖。
">>" 重定向命令,将重定向之前的命令输入写入命令之后的文件,写入操作时为添加。
%%bash
cat Shell_Practice_Sample | grep 'a' | wc -l
#打印Shell_Practice_Sample,从中找出含有字母a的行,然后统计一共有多少行
echo '********************************'
cat Shell_Practice_Sample | awk '{ print "cp Shell_Practice_Sample "$1".ipynb"}'
#打印Shell_Practice_Sample,以空格为间隔打印出每行的第一个单词,然后按照格式输出
echo '********************************'
ps -aux | sort -nk 2 | head -n 3
# 查看此时服务上所有的进程,并且按照PID排列, 显示最小的2个PID进程
echo '********************************'
通过管道命令,我们可以轻易地组合任何命令,并且这行可以是无限长的,也就是说我们可以使用无限次的管道命令。
这极大的提高了我们使用shell命令的效率,让我们可以很轻松的实现,查找,定位,排序,筛选,修改等操作
%%bash
cat Shell_Practice_Sample | grep 'a' > Shell_Practice_Sample_With_a
#打印Shell_Practice_Sample,从中找出含有字母a的行,并覆盖写入Shell_Practice_Sample_With_a
cat Shell_Practice_Sample_With_a
# 显示Shell_Practice_Sample_With_a
echo '********************************'
echo 'Test_Sample' > Shell_Practice_Sample_Line2to3
#将‘Test_Sample’覆盖写入Shell_Practice_Sample_Line2to3
cat Shell_Practice_Sample | head -n 3 | tail -n 2 >> Shell_Practice_Sample_Line2to3
#打印Shell_Practice_Sample,从中找出第二行到第三行,添加写入Shell_Practice_Sample_Line2to3
cat Shell_Practice_Sample | tail -c 8 >> Shell_Practice_Sample_Line2to3
#打印Shell_Practice_Sample, 从中找出最后八个字符,添加写入Shell_Practice_Sample_Line2to3
cat Shell_Practice_Sample_Line2to3
# 显示Shell_Practice_Sample_Line2to3
管道(Pipeline)和重定向(Redirecting)是我们在服务上非常频繁使用的命令之一,同时这两者有时候又会让人困惑,因为两者都是将符号之前的信息输入到符号之后,这里重点讲一下区别:
管道(Pipeline) |
指的是将前面命令的输出作为后面命令的输入,也就是说前面的命令是要有输出的,并且通常后面的命令也要要求输入。
重定向(Redirecting) >
/>>
指的是将前面命令的输出写入/添加到某个文件,后面通常不涉及传递给后面命令输入。
Linux原生,无需安装与配置
在任何的linux服务器中都内置了shell命令,无需额外的配置和安装,并且在服务器端的大多数操作并不依赖图形界面,根据以上列出的命令,我们完全可以实现,而且是更高效的实现路径变换,文件查找,筛选,修改,删除等操作。所以学习Shell命令在地球物理学中还是必须且有意义的。
结合awk等文本处理器,高效且易于编写
本次课程的程序部分都是基于python进行了改写,诚然,作为通用的脚本语言,python广受大家的喜爱,事实上对于地球物理学的应用来说,我们的shell环境下操作和文本处理,是完全可以更高效的编写和实现的。随着使用和学习的深入,将Shell,awk,sed等嵌合在一起的编写脚本会远比通用的python脚本要容易编写的多,并且由于编译和执行效率上存在损失,实际工作中结合shell的相关文本流处理显著的快不少。
sort
排序命令
grep
查找关键词
ps
查看进程
du
查看磁盘占用
awk
*文本行编辑
sed
*文本流处理
echo
显示到标准输出
find
查找文件
wc
计数
chmod
修改权限
Hongyu Xiao: hongyu.xiao@hotmail.com